package cn.wolfcode.luowowo.mgrsite.listener;

import cn.wolfcode.luowowo.article.domain.StrategyDetail;
import cn.wolfcode.luowowo.article.service.IStrategyDetailService;
import cn.wolfcode.luowowo.cache.service.IStrategyStatisVORedisService;
import cn.wolfcode.luowowo.cache.util.RedisKeys;
import cn.wolfcode.luowowo.cache.vo.StrategyStatisVO;
import cn.wolfcode.luowowo.common.util.BeanUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 *  redis 数据初始化监听器
 *  ContextRefreshedEvent: 容器启动或重新加载触发的事件
 */
//@Component
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent> {

    @Reference
    private IStrategyDetailService strategyDetailService;

    @Reference
    private IStrategyStatisVORedisService strategyStatisVORedisService;

    // 当容器启动时，执行该方法
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("-------------初始化开始--------------");
        // intiStrategyStatisVO();
        intiStrategyStatisVOkeys();
        intiHotStrategy();
        System.out.println("-------------初始化结束--------------");
    }

    // 使用 incrementScore 对 zset 进行初始化操作时，如果不校验 zset 中 key 是否存在，会在之前分数基础上再加分,导致数据出错
    public boolean isZsetStatisVoExist(String zsetKey, Long sid){
        return strategyStatisVORedisService.isZsetStatisVoExist(zsetKey, sid);
    }

    // 给海内外攻略推荐初始化
    public void intiStrategyStatisVOkeys(){
        List<StrategyDetail> list = strategyDetailService.list();
        for (StrategyDetail strategyDetail : list) {
            // 点赞数 + 收藏数
            if(isZsetStatisVoExist(RedisKeys.STRATEGY_ZSET_SORT_COMMEND.getPrefix(), strategyDetail.getId())){
                continue;
            }
            int score = strategyDetail.getThumbsupnum() + strategyDetail.getFavornum();
            strategyStatisVORedisService.addCommendScore(strategyDetail.getId(), score); // 注意，这里为了方便测试，可以先把数据归零,实际分数应该是 score
        }
    }

    // 给热门攻略初始化
    public void intiHotStrategy(){
        List<StrategyDetail> list = strategyDetailService.list();
        for (StrategyDetail strategyDetail : list) {
            // 阅读数 + 评论数
            int score = strategyDetail.getViewnum() + strategyDetail.getReplynum();
            strategyStatisVORedisService.addHotScore(strategyDetail.getId(), score);// 注意，这里为了方便测试，可以先把数据归零,实际分数应该是 score
        }
    }

    // 攻略统计数据的初始化
    public void intiStrategyStatisVO(){
        // 1、去 mysal 中拿到所有数据 list
        List<StrategyDetail> list = strategyDetailService.list();
        for (StrategyDetail strategyDetail : list) {
        // 2、创建 vo 对象,存到 redis 中 // 注意什么时候不用再去存
            if(strategyStatisVORedisService.isStatisVoExist(strategyDetail.getId())){
                continue;
            }
            StrategyStatisVO vo = new StrategyStatisVO();
            BeanUtil.copyProperties(vo, strategyDetail);
            // 把不一样的属性单独设置
            vo.setDestName(strategyDetail.getDest().getName());
            vo.setDestId(strategyDetail.getDest().getId());
            vo.setStrategyId(strategyDetail.getId());
            strategyStatisVORedisService.setStrategyStatisVO(vo);
        }
    }


}
